package lagou.work2;

import java.io.*;

public class CopyAndDeleteThread implements Runnable {
    @Override
    public void run() {
        try {
            copyDir("G:\\demo3", "G:\\demo4");
            Delete("G:\\demo3");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 拷贝目录，是文件则拷贝，是文件夹则进入
     *
     * @param srcDir 源目录
     * @param desDir 目标目录
     * @throws IOException
     */
    public void copyDir(String srcDir, String desDir) throws IOException {
        System.out.println("正在进入" + srcDir);
        File srcFile = new File(srcDir);
        File desFile = new File(desDir);
        //如果目标目录不存在,则新建
        if (!desFile.exists()) {
            desFile.mkdirs();
        }
        //获取源目录文件
        File[] files = srcFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            //如果是一个文件,则通过IO流实现拷贝
            if (files[i].isFile()) {
                copyFile(files[i].getAbsolutePath(), desDir + "/" + files[i].getName());
            }
            //如果是一个目录，则递归调用本方法，进入目录
            else if (files[i].isDirectory()) {
                copyDir(files[i].getAbsolutePath(), desDir + "/" + files[i].getName());
            }
        }
    }

    /**
     * 拷贝文件
     *
     * @param srcDir 源目录
     * @param desDir 目标目录的上一层
     */
    public void copyFile(String srcDir, String desDir) {
        File srcFile = new File(srcDir);
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        if (srcFile.isFile()) {

            try {
                bis = new BufferedInputStream(new FileInputStream(srcDir));
                bos = new BufferedOutputStream(new FileOutputStream(desDir));
                // 3.不断地从输入流中读取一行字符串并写入到输出流中
                System.out.println("正在拷贝文件" + srcDir);
                byte[] bArr = new byte[1024];
                int res = 0;
                while ((res = bis.read(bArr)) != -1) {
                    bos.write(bArr, 0, res);
                }
                System.out.println(srcDir + "文件拷贝成功！");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 4.关闭流对象并释放有关的资源
                if (null != bos) {
                    try {
                        bos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (null != bis) {
                    try {
                        bis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    /**
     * 删除文件及文件夹
     *
     * @param srcDir
     */
    public static void Delete(String srcDir) {
        System.out.println("正在进入" + srcDir);
        File srcFile = new File(srcDir);
        //获取目录文件
        File[] files = srcFile.listFiles();
        if (null != files) {
            for (int i = 0; i < files.length; i++) {
                //是文件则直接删除
                if (files[i].isFile()) {
                    files[i].delete();
                    System.out.println(srcDir + "/" + files[i].getName() + "已删除");
                }
                //是文件夹，则递归调用方法
                else {
                    Delete(files[i].toString());
                }
            }

        }
        //删除文件夹
        srcFile.delete();

    }


}

